\documentclass[10.5pt, a4paper]{article}

\usepackage{xeCJK}
\newCJKfontfamily{\heiti}[AutoFakeBold={3.17}]{SimHei}

\usepackage{geometry}
\geometry{
    left = 0.6in,
    right = 0.6in,
    top = 0.8in,
    bottom = 1.0in
}
\usepackage{amssymb,amsbsy,amsmath,xcolor,mathrsfs,graphicx,tikz,xcolor}
\usepackage{listings}
\usepackage{tasks}
\settasks{
    label = \Alph*. ,
    label-width = 16pt
}

\renewcommand{\title}[3]{
    \begin{center}
        \Large\heiti #1~年~#2~月 Python~#3级考试
    \end{center}
}
\newcommand{\TimeAndName}[1]{
    \begin{center}
        考试时间:~#1~ 分钟 \qquad\qquad\qquad\qquad 姓名:\underline{\quad\quad\quad\quad}
    \end{center}
}

\begin{document}
    \lstset{
        language = python,
        keywordstyle = \color{orange}\bfseries,
        emph = {print,bool,chr,ord,sorted,float,type,oct,hex,abs,sum,len,int,open,list,map,
        str,min,input,max,range,divmod,ascii,round,all,bin,NameError,eval,any,pow,enumerate,set,reversed},
        emphstyle = \color{purple}\bfseries,
        showspaces = false,
        basicstyle = \ttfamily,
        morekeywords = {True,False}
    }

    \title{2021}{3}{三}
    
    \TimeAndName{60}
    
    \vspace{1cm}
    {\noindent\heiti 第一部分、单选题(共 25 题,每题 2 分,共50分.)}

    \begin{enumerate}
        % 1
        \item 以下代码的输出结果是?(\qquad)
        \begin{lstlisting}
            x = 0x10
            print(x)
        \end{lstlisting}
        \begin{tasks}(4)
            \task 2
            \task 8
            \task 10
            \task 16
        \end{tasks}

        % 2
        \item 关于语句\lstinline!f=open('d:/a.txt','r')!,下列描述不正确的是?(\qquad)
        \begin{tasks}
            \task f是变量
            \task 'r'以只读方式打开文件
            \task 如果文件a.txt不存在，不会报错
            \task 'd:/a.txt'是文件路径，代表d盘中一个名为'a.txt'的文件
        \end{tasks}

        % 3
        \item 表达式\lstinline!all([1,True,True])!的结果是?(\qquad)
        \begin{tasks}(4)
            \task 1
            \task False
            \task 出错
            \task True
        \end{tasks}

        % 4
        \item Python中表示合法的二进制整数是?(\qquad)
        \begin{tasks}(4)
            \task 0bC3F
            \task 0B1010
            \task 0B1019
            \task 0b1708
        \end{tasks}
        
        % 5
        \item 执行语句\lstinline!x,y,z=tuple([2,1,3])!之后，变量y的值为?(\qquad)
        \begin{tasks}(4)
            \task 1
            \task 2
            \task \lstinline![1]!
            \task \lstinline![2,1,3]!
        \end{tasks}

        % 6
        \item 下列代码的执行结果是?(\qquad)
        \begin{lstlisting}
            ls = [[1,2,3],[[4,5],6],[7,8]]
            print(len(ls))
        \end{lstlisting}
        \begin{tasks}(4)
            \task 1
            \task 3
            \task 4
            \task 8
        \end{tasks}

        % 7
        \item 下列能产生列表\lstinline![1,3,5,7,9]!的表达式是?(\qquad)
        \begin{tasks}(4)
            \task list(range(0,9))
            \task list(range(1,10))
            \task list(range(0,9,2))
            \task list(range(1,10,2))
        \end{tasks}

        % 8
        \item 二维列表data中，元素"3"的表示是?(\qquad)
        \begin{lstlisting}
            data = [
                [1,2],
                [3,4]
            ]
        \end{lstlisting}
        \begin{tasks}(4)
            \task \lstinline!data[0][0]!
            \task \lstinline!data[0][1]!
            \task \lstinline!data[1][0]!
            \task \lstinline!data[1][1]!
        \end{tasks}

        % 9
        \item 下列代码的输出结果是?(\qquad)
        \begin{lstlisting}
            n = 2
            b = bool(n-2)
            print(n, b)
        \end{lstlisting}
        \begin{tasks}(4)
            \task 2\ 0
            \task 0\ True
            \task 2\ False
            \task 0\ False
        \end{tasks}

        % 10
        \item 键盘输入数字10，以下代码的输出结果是?(\qquad)
        \begin{lstlisting}
            try:
                n = input("请输入一个整数:")
                n = n*n
            except:
                print("程序执行错误")
        \end{lstlisting}
        \begin{tasks}(4)
            \task 100
            \task 10
            \task 程序执行错误
            \task 程序没有任何输出
        \end{tasks}

        % 11
        \item 有如下列表\lstinline!1=[10,1,9,6,3,4]!,采用冒泡排序进行升序排序，请问第一趟排序之后的结果是？?(\qquad)
        \begin{tasks}(4)
            \task \lstinline![1,3,9,6,10,4]!
            \task \lstinline![1,9,6,3,10,4]!
            \task \lstinline![1,6,3,4,9,10]!
            \task \lstinline![1,3,4,6,9,10]!
        \end{tasks}

        % 12
        \item 表达式\lstinline!max(3,min(5,1,7))!的结果是?(\qquad)
        \begin{tasks}(4)
            \task 1
            \task 3
            \task 5
            \task 7
        \end{tasks}

        % 13
        \item \lstinline!set()!函数通过交集、差集、并集等关系删除重复数据，创建一个无序不重复元素集。下列程序执行结果正确的是?(\qquad)
        \begin{lstlisting}
            x = set("中国")
            y = set("美国")
            print(x & y)
        \end{lstlisting}
        \begin{tasks}(4)
            \task \lstinline{\{'中国'\}}
            \task \lstinline{\{'美国'\}}
            \task \lstinline{\{'中美国'\}}
            \task \lstinline{\{'国'\}}
        \end{tasks}

        % 14
        \item 下列不能用于异常处理结构中捕获特定类型的异常的语句是?(\qquad)
        \begin{tasks}(2)
            \task try-else语句
            \task try-except语句
            \task try-except-else语句
            \task try-except-finally语句
        \end{tasks}
        
        % 15
        \item 下列表达式结果不为10的是?(\qquad)
        \begin{tasks}(4)
            \task \lstinline!sum([1,2,3,4])!
            \task \lstinline!sum((1,2,3),4)!
            \task \lstinline!sum([1,2,3],4)!
            \task \lstinline!sum([1,2],[3,4])!
        \end{tasks}

        % 16
        \item 表达式\lstinline!divmod(40,3)!的结果是?(\qquad)
        \begin{tasks}(4)
            \task 13,1
            \task (13,1)
            \task 13
            \task 1
        \end{tasks}

        % 17
        \item 小明想对列表\lstinline!arr=[5,33,21,67,39,73,7,43]!中的数值进行升序排序，于是他编写了“选择排序”程序，在调试程序的过程，他故意将循环的次数改成了固定值，如下所示。请问，现在这个程序执行之后
        \lstinline!print(arr)!打印出的结果应该是?(\qquad)
        \begin{lstlisting}
            # 调试中的选择排序：

            arr = [5,33,21,67,39,73,7,43]
            n = len(arr)
            for i in range(0,4): #请注意这里到底循环了几次！
                k=i
                for j in range(i+1,n):# 准备进行前后两数比
                    if arr[j] < arr[k]: # 如果后数小于前一个数
                    k = j # 将前数的序号改为后数
                if k != i: # 下面，按序号交换两个数的值
                    (arr[k],arr[i])=(arr[i],arr[k])
            print (arr)
        \end{lstlisting}
        \begin{tasks}(2)
            \task \lstinline![5,7,21,33,39,43,67,73]!
            \task \lstinline![5,7,21,33,39,73,43,67]!
            \task \lstinline![5,7,21,67,39,73,33,43]!
            \task \lstinline![5,7,21,33,39,73,67,43]!
        \end{tasks}

        % 18
        \item 要表示10种不同的信息，需要的二进制位数至少为?(\qquad)
        \begin{tasks}(4)
            \task 2
            \task 4
            \task 5
            \task 3
        \end{tasks}

        % 19
        \item 下列代码的输出结果是?(\qquad)
        \begin{lstlisting}
            for i in range(1,6):
                if i%4 == 0:
                    continue
                else:
                    print(i, end=",")
        \end{lstlisting}
        \begin{tasks}(4)
            \task 1,2,3,
            \task 1,2,3,4
            \task 1,2,3,5,
            \task 1,2,3,5,6
        \end{tasks}

        % 20
        \item 以下关于算法以及算法的描述，错误的是?(\qquad)
        \begin{tasks}(2)
            \task 算法必须要在有限的步骤内完成
            \task 算法每个步骤的含义必须是确切的
            \task 算法必须有输入，但可以没有输出
            \task 算法可以没有输入，但必须要有输出
        \end{tasks}

        % 21
        \item 八进制10与十六进制10相加，其对应的十进制数是?(\qquad)
        \begin{tasks}(4)
            \task 20
            \task 26
            \task 24
            \task 18
        \end{tasks}

        % 22
        \item 下列代码的输出结果是?(\qquad)
        \begin{lstlisting}
            d = {"大海":"蓝色","天空":"灰色","大地":"黑色"}
            print(d["大地"])
        \end{lstlisting}
        \begin{tasks}(4)
            \task \lstinline!"大地"!
            \task 大地
            \task \lstinline!"黑色"!
            \task 黑色
        \end{tasks}

        % 23
        \item 假设city.csv文件内容如下，那么下列代码的输出结果是?(\qquad)
        \begin{figure}[htbp]
            \begin{minipage}{.68\textwidth}
                \begin{lstlisting}
                    f = open("city.csv", "r")
                    ls = f.read().split(",")
                    f.close()
                    print(ls)
                \end{lstlisting}
            \end{minipage}
            \begin{minipage}{.3\textwidth}
                \centering
                \includegraphics[width=0.8\textwidth]{23.png}
            \end{minipage}
        \end{figure}
        \begin{tasks}
            \task \lstinline{['巴哈马','巴林','孟加拉国','巴巴多斯\\n白俄罗斯','比利时','伯利兹']}
            \task \lstinline{['巴哈马','巴林','孟加拉国','巴巴多斯','白俄罗斯','比利时','伯利兹']}
            \task \lstinline{['巴哈马,巴林,孟加拉国,巴巴多斯,白俄罗斯,比利时,伯利兹']}
            \task \lstinline{['巴哈马','巴林','孟加拉国','巴巴多斯','\\n','白俄罗斯','比利时','伯利兹']}
        \end{tasks}

        % 24
        \item 下列代码的输出结果是?(\qquad)
        \begin{lstlisting}
            lis = list(range(4))
            print(lis)
        \end{lstlisting}
        \begin{tasks}(4)
            \task \lstinline{[0,1,2,3,4]}
            \task \lstinline{[0,1,2,3]}
            \task \lstinline{0,1,2,3,}
            \task \lstinline{0,1,2,3,4}
        \end{tasks}

        % 25
        \item 下列程序运行后的输出结果是?(\qquad)
        \begin{lstlisting}
            for i in reversed(range(10,0,-2)):
                print(i, end=" ")
        \end{lstlisting}
        \begin{tasks}(2)
            \task 2 4 6 8 10
            \task 0 2 4 6 8 10
            \task 12345678910
            \task 9 8 7 6 5 4 3 2 1 0
        \end{tasks}
    \end{enumerate}

    {\noindent\heiti 第二部分、判断题(共 10 题,每题 2 分,共20分.)}
    \begin{enumerate}
        \setcounter{enumi}{25}
        % 26
        \item \lstinline!int('0×25',16)!语句和\lstinline!int('25',16)!语句都能实现将十六进制数\lstinline!0x25!转换成十进制数的功能.(\qquad)

        %27
        \item 使用\lstinline!open()!函数打开\lstinline!'food.csv'!文件后，返回的是列表.(\qquad)
        
        %28
        \item 数据可分为一维数据、二维数据和多维数据.(\qquad)
        
        %29
        \item 语句try-except-finally中finally语句无论异常是否发生都必须执行的语句.(\qquad)
        
        %30
        \item CSV文件的每一行是一维数据，可以使用Python中的列表类型表示.(\qquad)
        
        %31
        \item 二进制数1010111转换为十六进制数是A7.(\qquad)
        
        %32
        \item \lstinline!abs()!函数的功能是将对小数进行取整，\lstinline!abs(-2.3)!的运行结果是2.(\qquad)
        
        %33
        \item \lstinline!chr()!函数用于将对象转换成字符串.(\qquad)
        
        %34
        \item \lstinline!enumerate()!函数将字符串、列表、元组、字典等组合为索引序列，同时列出数据和数据下标.(\qquad)
        
        %35
        \item 执行程序，结果为\lstinline!['春',夏','冬']!.(\qquad)
        \begin{lstlisting}
            senson = ["春","夏","秋","冬"]
            senson.remove("秋")
            print(senson)
        \end{lstlisting}
    \end{enumerate}

    {\noindent\heiti 第三部分、编程题(共 3 题,共30分.)}
    \begin{enumerate}
        \setcounter{enumi}{35}
        
        % 36
        \item 一个四位数，如果在它的左边加一个数字8,就可以得到一个五位数；如果在它的右边加一个数字6,就可以得到另一个五位数，这两个五位数的和是121410。请问原来这个四位数是多少?
        
        现在请你编写程序，求出这个四位数。
        补全下面的代码：.
        
        \begin{lstlisting}
            for a in range(____1____):
                for b in range(____2____):
                    for c in range(0,10):
                        for d in range(0,10):
                            if (____3____)+(____4____) == 121410:
                                print(a,b,c,d)
        \end{lstlisting}
 
        
        % \vfill

        %37
        \item 请读取文件/data/subways.csv的数据，数据内容如下图显示：
        
        下列代码实现了读取“学号”和“身高”信息，输出“身高”达到120的学号，请你补全代码.
        
        补全下面的代码:
        \begin{figure}[htbp]
            \begin{minipage}{.68\textwidth}
                \begin{lstlisting}
                    import csv
                    with open('/data/____1____') as f:
                        rows = list(csv.reader(f))
                        for row in rows[1:]:
                            if (int(row[1]) >= 120):
                                print(____2____)
                \end{lstlisting}
            \end{minipage}
            \begin{minipage}{.3\textwidth}
                \centering
                \includegraphics[width=0.4\textwidth]{37.png}
            \end{minipage}
        \end{figure}
        
        % \vfill

        % \newpage
        % 38
        \item 有一组数据\lstinline![0,20,0,4,31]!存放在nums中，请将列表中的所有零移动到列表尾.

        \begin{lstlisting}
            nums = [0,20,0,4,31]
            
            ____请自行补全全部代码____

            print(nums)
        \end{lstlisting}
    \end{enumerate}

    \newpage
    \begin{center}
        \Huge \heiti 参考答案
    \end{center}

        \begin{tasks}[label=\arabic*.](5)
            \task D
            \task C
            \task D
            \task B
            \task A

            \task B
            \task D
            \task C
            \task C
            \task C

            \task B
            \task B
            \task D
            \task A
            \task D

            \task B
            \task D
            \task B
            \task C
            \task C

            \task C
            \task D
            \task A
            \task B
            \task A

            \task $\checkmark$
            \task $\times$
            \task $\checkmark$
            \task $\checkmark$
            \task $\checkmark$

            \task $\times$
            \task $\times$
            \task $\times$
            \task $\checkmark$
            \task $\checkmark$
        \end{tasks}

        \begin{enumerate}
            \setcounter{enumi}{35}
            \item \begin{lstlisting}
                1,10        #1
                0,10        #2
                80000+a*1000+b*100+c*10+d        #3
                a*10000+b*1000+c*100+d*10+6      #4
            \end{lstlisting}

            \item \begin{lstlisting}
                '/data/subways.csv','r'    #1
                row[0]     #2
            \end{lstlisting}

            \item \begin{lstlisting}
                for num in nums:
                    if num == 0:
                        nums.append(0)
                        nums.remove(0)
                print(nums)
            \end{lstlisting}
        \end{enumerate}
\end{document}